home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / libs / sphigs / sph_mac.hqx / SRGP port to 5.0 (compressed) / SRGP_SPHIGS Root / MacSRGP / srgp_pattern.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-13  |  9.0 KB  |  368 lines

  1. #include "HEADERS.h"
  2. #include "srgplocal.h"
  3. #include "default_patterns.h"
  4.  
  5.  
  6. #define BUFFERSIZE   150
  7.  
  8. static char   inputline [BUFFERSIZE+1];
  9.  
  10. #ifdef X11
  11.    static XImage *ximage_pix, *ximage_bit;
  12.    static GC     putimagegc_pix, putimagegc_bit;
  13. #endif
  14.  
  15. #include "srgp_pattern.proto.h"
  16.  
  17.  
  18.  
  19. /** INITIALIZATION OF THE PATTERN TABLE
  20. Bitmap pattern table is initialized; or at least a large portion of
  21. it is initialized.
  22.  
  23. The pixmap pattern table's 0th element is initialized to all 0.
  24. No other pixmap patterns are initialized.
  25.  
  26. WARNING: CURRENTLY THE MAC VERSION INIT'S NO PIXMAPS.
  27.  
  28. This routine also initializes some static variables that are 
  29. necessary for making runtime changes to the pixmap table.
  30. **/
  31.  
  32. void
  33. SRGP__initDefaultPatterns(void)
  34. {
  35.    register i;
  36.  
  37.    /******** bitmap table */
  38.    for (i=0; i <= 104; i++) {
  39. #ifdef X11
  40.       srgp__bitmapPatternTable[i] = 
  41.      XCreateBitmapFromData
  42.         (srgpx__display, srgp__canvasTable[0].drawable.win, 
  43.          default_bitpat[i], 8, 8);
  44. #endif
  45. #ifdef THINK_C
  46.       memcpy (srgp__bitmapPatternTable[i], default_bitpat[i], (size_t)8);
  47. #endif
  48.    }
  49.    
  50. #ifdef X11
  51.    for ( ; i <= MAX_PATTERN_INDEX; i++)
  52.       srgp__bitmapPatternTable[i] = NULL;
  53. #endif
  54.  
  55.  
  56.    /******** pixmap table */
  57. #ifdef X11
  58.    srgp__pixmapPatternTable[0] = 
  59.       XCreatePixmapFromBitmapData
  60.      (srgpx__display, srgp__canvasTable[0].drawable.win, 
  61.       default_bitpat[0], 8, 8,
  62.       COLORINDEX(SRGP_BLACK), COLORINDEX(SRGP_WHITE), 
  63.       srgp__available_depth);
  64. #endif
  65. #ifdef THINK_C
  66.    srgp__pixmapPatternTable[0] = NULL;
  67. #endif
  68.  
  69.    for (i=1; i <= MAX_PATTERN_INDEX; i++)
  70.       srgp__pixmapPatternTable[i] = NULL;
  71.  
  72.  
  73. #ifdef X11
  74.    /******** imaging variables */
  75.    putimagegc_pix =    
  76.       XCreateGC (srgpx__display, srgp__canvasTable[0].drawable.win,
  77.          0L, NULL);
  78.    putimagegc_bit =    
  79.       XCreateGC (srgpx__display, srgp__bitmapPatternTable[0],
  80.          0L, NULL);
  81.    ximage_pix = XGetImage (srgpx__display,
  82.                srgp__pixmapPatternTable[0],
  83.                0,0, 8,8,    
  84.                0xffff,
  85.                XYPixmap);
  86.    ximage_bit = XGetImage (srgpx__display,
  87.                srgp__bitmapPatternTable[0],
  88.                0,0, 8,8,    
  89.                1,
  90.                XYPixmap);
  91. #endif
  92. }
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99. /** LOAD A SINGLE BITMAP PATTERN
  100. Application must send data in the form of 8 characters, the
  101. same format created by the X bitmap editor.
  102. **/
  103.  
  104. void SRGP_loadBitmapPattern (int pattern_id, char *data)
  105. {
  106.    register i,j;
  107.  
  108.  
  109.    DEBUG_AIDS{
  110.       SRGP_trace (SRGP_logStream, "SRGP_loadBitmapPattern %d %x\n", 
  111.           pattern_id, data);
  112.       srgp_check_system_state();
  113.       LeaveIfNonFatalErr();
  114.    }
  115.  
  116. #ifdef X11
  117.    /* CREATE THE BITMAP (if not already) */
  118.    if (NULL == srgp__bitmapPatternTable[pattern_id]) 
  119.       srgp__bitmapPatternTable[pattern_id] = 
  120.      XCreatePixmap
  121.         (srgpx__display, srgp__canvasTable[0].drawable.win, 8, 8,
  122.          1);
  123.  
  124.    if (NULL == srgp__bitmapPatternTable[pattern_id]) {
  125.       SRGP__error (ERR_PATTERN_ALLOCATION);
  126.       return;
  127.    }
  128.  
  129.    /* PAINT THE PIXELS */
  130.    for (i=0; i<8; i++)
  131.       for (j=7; j>=0; j--)
  132.      XPutPixel (ximage_bit, i,j, (data[i]&(1<<j))?XBLACK:XWHITE);
  133.  
  134.  
  135.    /* PUT THE XIMAGE INTO THE BITMAP */
  136.    XPutImage (srgpx__display,
  137.           srgp__bitmapPatternTable[pattern_id],
  138.           putimagegc_bit,
  139.           ximage_bit,
  140.           0,0, 0,0, 8,8);
  141. #endif
  142.  
  143. #ifdef THINK_C
  144.    memcpy (srgp__bitmapPatternTable[pattern_id], data, 8);
  145. #endif
  146. }
  147.  
  148.  
  149.  
  150.  
  151. #ifdef X11
  152.  
  153. /** LOAD A SINGLE PIXMAP PATTERN
  154. Application must send data in the form of 8x8 array of integers.
  155. The first integer is the color value for the top-left pixel.
  156. The second integer is for the 2nd pixel on the top row.
  157.    etc.
  158. **/
  159.  
  160. void SRGP_loadPixmapPattern (int pattern_id, int *data)
  161. {
  162.    register i,j;
  163.  
  164.  
  165.    DEBUG_AIDS{
  166.       SRGP_trace (SRGP_logStream, "SRGP_loadPixmapPattern %d %x\n", 
  167.           pattern_id, data);
  168.       srgp_check_system_state();
  169.       LeaveIfNonFatalErr();
  170.    }
  171.  
  172.    /* CREATE THE PIXMAP (if not already) */
  173.    if (NULL == srgp__pixmapPatternTable[pattern_id]) 
  174.       srgp__pixmapPatternTable[pattern_id] = 
  175.      XCreatePixmap
  176.         (srgpx__display, srgp__canvasTable[0].drawable.win, 8, 8,
  177.          srgp__available_depth);
  178.    if (NULL == srgp__pixmapPatternTable[pattern_id]) {
  179.       SRGP__error (ERR_PATTERN_ALLOCATION);
  180.       return;
  181.    }
  182.  
  183.    /* PAINT THE PIXELS */
  184.    for (i=0; i<8; i++)
  185.       for (j=7; j>=0; j--)
  186.       XPutPixel (ximage_pix, i,j, XCOLOR(COLORINDEX(data[(i<<3)+j])));
  187.  
  188.  
  189.    /* PUT THE XIMAGE INTO THE PIXMAP */
  190.    XPutImage (srgpx__display,
  191.           srgp__pixmapPatternTable[pattern_id],
  192.           putimagegc_pix,
  193.           ximage_pix,
  194.           0,0, 0,0, 8,8);
  195. }
  196.  
  197. #endif
  198.  
  199.  
  200.  
  201. /** LOAD BITMAP PATTERNS 
  202. This command reads from an input stream (already
  203. opened by the caller) that should contain one or more bitmap pattern specs.
  204. It reads until EOF is seen, or until any parsing error occurs.
  205.  
  206. Each spec must occupy exactly two lines.  The first line must look like this:
  207.  
  208. static char bitpat_X[] = {
  209.  
  210. where X is a non-negative integer.
  211.  
  212. The second line must specify 8 hexademical numbers in this format:
  213.  
  214.    0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??};
  215.  
  216. Each 2-hexdigit number is 8 bits and thus describes one "scan line" 
  217. of the pattern.
  218.  
  219. This format is compatible with the output of
  220. the X bitmap editor (called, appropriately, "bitmap") AS LONG AS
  221. that editor is invoked in this manner:
  222.    
  223.     bitmap bitpat_X 8x8
  224.  
  225. The output files from several bitmap editing sessions can be concatenated
  226. to form a single file defining many bitmap patterns, to be loaded
  227. in a single call to SRGP_loadBitmapPatterns.
  228.  
  229. As a convenience, any lines beginning with '#' are ignored, but these
  230. comment lines must not interrupt a single two-line spec sequence.
  231.  
  232. The closing of the input stream must be performed by the caller.
  233.  
  234. RETURNS 0 if no problem opening the file and parsing the input.
  235. RETURNS 1 if any problems at all occurred.
  236. **/
  237.  
  238. int
  239. SRGP_loadBitmapPatternsFromFile (FILE *stream)
  240.    int intbit[8];
  241.    char charbit[8];
  242.    int i, pattern_id, retval;
  243.  
  244.  
  245.    DEBUG_AIDS{
  246.       srgp_check_system_state();
  247.       SRGP_trace (SRGP_logStream, "SRGP_loadBitmapPatternsFromFile %x\n", 
  248.           stream);
  249.       LeaveIfNonFatalErr();
  250.    }
  251.  
  252.    PUSH_TRACE;
  253.    while (fgets(inputline, BUFFERSIZE, stream)) {   /* WHILE NOT EOF */
  254.  
  255.       /* IGNORE COMMENT LINES. */
  256.       if (inputline[0] == '#')
  257.      continue;
  258.  
  259.       /* PARSE TO FIND PATTERN INDEX. */
  260.       if (sscanf (inputline, "static char bitpat_%d", &pattern_id) != 1)
  261.      return 1;  /* ERROR! spec start doesn't match required format */
  262.  
  263.       /* GET NEXT LINE: IT CONTAINS THE PATTERN BITS. */
  264.       if ( ! fgets(inputline, BUFFERSIZE, stream))
  265.      return 1;  /* ERROR! premature eof */
  266.  
  267.       /* PARSE THE PATTERN BITS LINE */
  268.       retval = sscanf (inputline,
  269.                " 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x",
  270.                &intbit[0], &intbit[1], &intbit[2], &intbit[3], 
  271.                &intbit[4], &intbit[5], &intbit[6], &intbit[7]);
  272.       if (retval != 8)
  273.      return 1;  /* ERROR! spec 2nd line doesn't match required format */
  274.  
  275.       /* TRANSFORM THE INT-ARRAY SPEC INTO CHAR-ARRAY SPEC. */
  276.       for (i=0; i<8; i++)
  277.      charbit[i]=intbit[i];
  278.  
  279.       PUSH_TRACE;
  280.       SRGP_loadBitmapPattern (pattern_id, charbit);
  281.       POP_TRACE;
  282.    }
  283.  
  284.    return 0;
  285. }
  286.  
  287.  
  288.  
  289.  
  290.  
  291. #ifdef X11
  292.  
  293. /** LOAD PIXMAP PATTERNS FROM FILE
  294. This command reads from an input stream (already
  295. opened by the caller) that should contain one or more pixmap pattern specs.
  296. It reads until EOF is seen, or until any parsing error occurs.
  297.  
  298. Each spec must occupy exactly nine lines.  The first line must look like this:
  299.  
  300. static int pixpat_X[] = {
  301.  
  302. where X is a non-negative integer.
  303.  
  304. The next eight lines each describes one "scan line" of the pixmap pattern,
  305. looking like this:
  306.  
  307.    ?, ?, ?, ?, ?, ?, ?, ?
  308.  
  309. Each question mark represents a non-negative decimal color-value number.
  310.  
  311. As a convenience, any lines beginning with '#' are ignored, but these
  312. comment lines must not interrupt a single nine-line spec sequence.
  313.  
  314. The closing of the input stream must be performed by the caller.
  315.  
  316. RETURNS 0 if no problem opening the file and parsing the input.
  317. RETURNS 1 if any problems at all occurred.
  318. **/
  319. int
  320. SRGP_loadPixmapPatternsFromFile (FILE *stream)
  321. {
  322.    register i;
  323.    int pattern_id, retval;
  324.    int data[8][8];
  325.       
  326.  
  327.    DEBUG_AIDS{
  328.       srgp_check_system_state();
  329.       SRGP_trace (SRGP_logStream, "SRGP_loadBitmapPatternsFromFile %x\n", 
  330.           stream);
  331.       LeaveIfNonFatalErr();
  332.    }
  333.  
  334.    while (fgets(inputline, BUFFERSIZE, stream)) {   /* WHILE NOT EOF */
  335.  
  336.       /* IGNORE COMMENT LINES. */
  337.       if (inputline[0] == '#')
  338.      continue;
  339.  
  340.       /* PARSE TO FIND PATTERN INDEX. */
  341.       if (sscanf (inputline, "static int pixpat_%d", &pattern_id) != 1)
  342.      return 1;  /* ERROR! spec start doesn't match required format */
  343.  
  344.       /* GET AND PROCESS THE NEXT EIGHT LINES */
  345.       for (i=0; i<8; i++) {
  346.  
  347.      if ( ! fgets(inputline, BUFFERSIZE, stream))
  348.         return 1;  /* ERROR! premature eof */
  349.  
  350.      retval = sscanf (inputline,
  351.               "%d, %d, %d, %d, %d, %d, %d, %d",
  352.               &data[i][0], &data[i][1], &data[i][2], &data[i][3], 
  353.               &data[i][4], &data[i][5], &data[i][6], &data[i][7]);
  354.      if (retval != 8)
  355.         return 1;  /* ERROR! spec line doesn't match required format */
  356.       }
  357.  
  358.       PUSH_TRACE;
  359.    SRGP_loadPixmapPattern (pattern_id, &(data[0][0]));
  360.    POP_TRACE;
  361.    }
  362.  
  363.    return 0;
  364. }
  365.  
  366. #endif
  367.